<?php

/**
 * @package   auto_occasion
 * @subpackage 
 * @author    CMS
 * @copyright 2011
 * @license    All rights reserved
 **/

class FormuleSrv {

    /**
     *Fonction pour afficher la liste des formules
    */
    public function liste($_iOffset, $_iParPage){

          $dao= jDao::get("commun~ao_formule");

          $condition  = jDao::createConditions();

          $tResult['formule']   =  $dao->findBy($condition,$_iOffset,$_iParPage)->fetchAll();
          $tResult['nbRecords'] =  $dao->countBy($condition);
          return $tResult;

        }



    /**
     *Fonction pour afficher la liste des options de formule existantes
    */
    public function liste_option(){
          $dao= jDao::get("commun~option_formule");
          $condition  = jDao::createConditions();
          $condition->addCondition('status','=', '1');
          $liste_option = $dao->findBy($condition);

          return $liste_option->fetchAll();
    }

    /**
     *Récupère une formule à partir de son prix
    */
    public function getByPrice($_prix){
          $dao= jDao::get("commun~ao_formule");
          $condition  = jDao::createConditions();
          $condition->addCondition('prix','=', $_prix);
          $liste_option = $dao->findBy($condition);

          $retour = $liste_option->fetchAll();
          return $retour[0];
    }


    /**
     * Fonction pour ajouter une formule
     * @param object $_formule
    */
    public function ajouter($_formule){
        jClasses::inc("commun~communSrv");

        $dao = jDao::get('commun~ao_formule');
        $formule= jDao::createRecord("commun~ao_formule");
        $formule->titre      = $_formule->titre;
        $formule->prix       = $_formule->prix;
        $formule->status     = $_formule->status;
        $formule->options    = $_formule->options;
        $formule->content    = $_formule->content;
        $formule->date_debut = communSrv::toDateSql($_formule->debut);
        $formule->date_fin   = communSrv::toDateSql($_formule->fin);
        //$formule->created_at = $_formule->created_at;
        
        if ($dao->insert($formule)) {
            $_formule->id = $formule->id;
            self::updtFormule($_formule);

            return $formule ;
        } else {
            return false ;
        }
    }



    /**
     * Fonction pour modifier une formule
     * @param object $_option
     */
    public static function modifier($_formule){
        jClasses::inc("commun~communSrv");

        $dao = jDao::get('commun~ao_formule');
        $formule= $dao->get($_formule->id);

        $formule->titre       = $_formule->titre;
        $formule->prix        = $_formule->prix;
        $formule->status      = $_formule->status;
        $formule->options     = $_formule->options;
        $formule->content     = $_formule->content;
        $formule->date_debut  = communSrv::toDateSql($_formule->debut);
        $formule->date_fin    = communSrv::toDateSql($_formule->fin);

        if ($dao->update($formule)) {
            self::updtFormule($_formule);
            return $formule ;
        } else {
            return false ;
        }
    }

    /**
     * l'utilisation de l'editor wysiwyg rend difficile la mAJ ou l'ajout des données 
     * on va passer par un système d'update classique
     * 
     * @param object $formule
     *
     * @return 
     */
     public static function updtFormule ($formule) {
        $cnx     = jDb::getConnection();
        $sql     = " UPDATE ao_formule SET content = '".addslashes($formule->content)."' WHERE id = $formule->id";
        $cnx     -> exec($sql);
     }

    /**
     * Fonction pour relier  une option � une formule
     * @param object $_formule
     */
    public function ajout_option($_id,$_option){
        
        $cnx     = jDb::getConnection();
        $sql     = self::getQueryInsertFormuleOption($_id,$_option);
        $cnx     -> exec($sql);
    }


    /**
     * Fonction pour relier  une option � une formule
     * @param int $idFormule
     * @param array $option
    */
    public static function getQueryInsertFormuleOption($idFormule, $option){
        $query = " INSERT INTO ao_lien_formule (id_formule,id_option_formule) VALUES ";
        foreach ($option as $k=>$item) {
                $sep = (!$k)? "" : ",";
                $query .= $sep . "($idFormule, $item)";
            }

        return $query;
    }


    /**
     * Fonction pour relier  une option � une formule
     * @param object $_formule
     */
    public function getIbByDate($date){

        $cnx    = jDb::getConnection();
        $sql    = "SELECT id  FROM ao_formule WHERE created_at='" . $date ."' LIMIT 1";
        $rs     = $cnx->query($sql);

        return $rs->fetch();
    }



    /**
     * Fonction permettant d'avoir une option � partir de son id
     * @param object $_id
     */
    public function chargeParId($_id){

        $dao = jDao::get('commun~ao_formule');

        return  $dao->get($_id);
    }



    /**
     * Fonction permettant d'initialiser un objet option
     * @param $login
     * @return object
     *
     */
    public function init () {

        return jDao::createRecord("commun~ao_formule");
    }

    /**
     * Fonction permettant de lister les options d'une formule
     * @param $login
     * @return object
     *
     */

     public function getOptionFormule($id){

        $cnx     = jDb::getConnection();
        $sql     = " SELECT id_option_formule FROM ao_lien_formule WHERE id_formule=" . $id ;
        
        $rs = $cnx->query($sql);
        $result = array();
        while($row = $rs->fetch()){
            $result[] = $row->id_option_formule;
        }

        return $result;
    }

    /**
     * Fonction permettant de lister les options d'une formule
     * @param $login
     * @return object
     *
     */

     public function getOptionFormuleList(){

        $cnx  = jDb::getConnection();
        $sql  = " SELECT aol.id_formule,aof.id_option_formule, aof.lib_option_formule FROM ao_lien_formule aol,  ao_option_formule aof ";
        $sql .= " WHERE aol.id_option_formule = aof.id_option_formule";
        $rs   = $cnx->query($sql);

        $result = array();
        while($row = $rs->fetch()){
            $result[] = $row;
        }

        return $result;
    }

    /**
     * Fonction permettant de lister les options d'une formule
     * @param $login
     * @return object
     *
     */

     public function getAll($formule, $option){
        $result = array();
        foreach ($formule as $item) {
            $oFormule           = new stdClass();
            $oFormule->titre        = $item->titre;
            $oFormule->content      = $item->content;
            $oFormule->prix         = $item->prix;
            $oFormule->date_debut   = $item->date_debut;
            $oFormule->date_fin     = $item->date_fin;
            $oFormule->id           = $item->id;
            $oFormule->status       = $item->status;
			//$oFormule->isUsed		= self::checkIfFormuleUsed($_formuleId);
            $oFormule->options      = array();

            foreach ($option as $itemOption) {
                if ($itemOption->id_formule == $oFormule->id) {
                    array_push($oFormule->options, $itemOption->lib_option_formule);
                }
            }
            array_push($result, $oFormule);
        }

        return $result;
    }
	
	public function checkIfFormuleUsed($_formuleId){
		
		$cnx = jDb::getConnection();
		
        $sql  = " SELECT COUNT(annonce_id) AS nb FROM ao_annonce  ";
		$sql .= " INNER JOIN ao_voiture_occasion ON Occas_Annonce_Id = annonce_id";
		$sql .= " WHERE annonce_formule_id = '" . $_formuleId . "' ";
		$sql .= " AND Occas_Valide = '1'";
		$sql .= " AND Occas_Estpaye = '1'";
		
        $cnx->exec($sql);
        $rs = $cnx->query($sql);
        $res = $rs->fetchAll();
		return $res[0]->nb;
	
	}
    
    public static function supprimer ($_iId) {
        $oFac = jDao::get("commun~ao_formule") ;
        $oFormuaire = $oFac->get($_iId) ;
        $oFormuaire->status = 2 ;
        return self::modifier($oFormuaire);
    }

    /**
     * Fonction pour relier  une option � une formule
     * @param object $_formule
     */
    public function updateIdOpt($_id,$_option){
        
        $cnx     = jDb::getConnection();
        $sql     = " UPDATE lien_optionformule SET option_list = '".$_option."' WHERE id_formule = " . $_id;
        $cnx->exec($sql);
    }
    /**
     * Fonction pour relier  une option � une formule
     * @param int       $_id id de la formule
     * @param string    $_option id des options
     */
    public function addIdOpt($_id,$_option){
        
        $cnx     = jDb::getConnection();

        $sql_     = " delete from lien_optionformule where id_formule = " . $_id;
        $cnx->exec($sql_);

        $sql     = " INSERT INTO  lien_optionformule VALUES ('".$_option."' ,  $_id)";
        $cnx->exec($sql);
    }

    /**
     * Fonction pour relier  une option � une formule à partir de la page choix formule avant l'ajout d'annonce dans le BO
     * @param object $_formule
     */
    public function linkOptFromList($idFormule, $zIdOpt){

            // gardrécupérer les options déjà présente dans la formule 
            $optionPresente = self::getOptionPresente($idFormule);

            // ajouter les nouvelles options et garder celles déjà présentes
            return self::mergeOldNewOption($optionPresente, $zIdOpt);
    }

    /**
     * Fonction pour relier  une option � une formule à partir de la page choix formule avant l'ajout d'annonce dans le BO
     * @param object $_formule
     */
    public function linkOptFrom($_idOccasion){
        if ($_SESSION['BO_SESS_FORMULE_CHOISIE'] && $_idOccasion) {
            $formuleChoisie = unserialize($_SESSION['BO_SESS_FORMULE_CHOISIE']);
            
            jClasses::inc("annonce~annonceFormuleSrv");
            $cnx   = jDb::getConnection();

            // gardrécupérer les options déjà présente dans la formule 
            $optionPresente = annonceFormuleSrv::getAnnonceChoix($_idOccasion);

            // ajouter les nouvelles options et garder celles déjà présentes
            $finalOptionList = $optionPresente;
            if($formuleChoisie->listeChoix != ''){
                $finalOptionList = ($finalOptionList != '') ? ','.$formuleChoisie->listeChoix : $formuleChoisie->listeChoix;
            }

            if($_idOccasion) {
                // récupérer les options définitives et interroger si elles sont ou non référencer ds la table ao_annonce_formule_achat
                // si oui, laisser comme tel, si non MAJ avec comme date d'achat la date du jour
                if ($finalOptionList) {
                    jClasses::inc('annonce~annonceFormuleSrv');
                    $tabToAdd     = array(); // tableau qui va stocker les id d'option à rajouter
                    $alreadyThere = annonceFormuleSrv::getAnnonceChoixAchat($_idOccasion); // les options déjà présentes
                    $tabOption    = explode(',', $finalOptionList); 

                    if (sizeof($alreadyThere)) {
                        // récupérer les option à rajouter
                        foreach ($alreadyThere as $there) {
                            if (!in_array($there->idOption, $tabOption)) {
                                $tabToAdd[] = $there->idOption;
                            }
                        }
                    } else {
                        // tout rajouter
                        $tabToAdd = $tabOption;
                    }

                    if (sizeof($tabToAdd)) {
                        // formation de la requete afin de l'executer qu'une seule fois
                        $queryAchat = annonceFormuleSrv::getQueryAchat($tabToAdd, $_idOccasion);
                        if ($queryAchat)
                            $cnx->exec($queryAchat);
                    }
                    
                }
                annonceFormuleSrv::deleteAnnonceChoice($_idOccasion);

                $sql   = " INSERT INTO  ao_annonce_formule (idOccasion, idFormule, idOption) VALUES ($_idOccasion, $formuleChoisie->idFormule, '".$finalOptionList."')";
                $cnx->exec($sql);

                $sql   = " UPDATE  ao_voiture_occasion SET annonce_formule_id = $formuleChoisie->idFormule 
                            WHERE IdOccasion  = $_idOccasion ";
                $cnx->exec($sql);
            }

            
        }
    }

    /**
     * Fonction pour récupérer les choix et options en fonction des id d'option et de choix
     * @param int $_idFormule
     */

    public static  function getPriceChoiceByOption ($_idOption, $_idChoix) {
        $sql  = " SELECT SUM(formch_prix) AS total FROM ao_option_formule_choix ";
        $sql .= " WHERE formch_optionFormId IN ($_idOption)";
        $sql .= " AND formch_id IN ($_idChoix)";
        $jdb = jDb::getDbWidget();

        return $jdb->fetchFirst($sql)->total;
    }
    /**
     * Fonction pour récupérer les options déjà associées à une formule
     * @param int $_idFormule
     */

    public static  function getOptionPresente ($_idFormule) {
        $sql = "SELECT option_list FROM lien_optionformule";
        if ($_idFormule)
            $sql .= " WHERE id_formule = $_idFormule ";
        $jdb = jDb::getDbWidget();

        return $jdb->fetchFirst($sql)->option_list;
    }



    /**
     * Fonction pour combiner les anciennes et les nouvells options pour la formule
     * @param string $oldOpt
     * @param string $newOpt
     * 
     * @return string
     */

    public static  function mergeOldNewOption ($oldOpt, $newOpt) {
        $opt = array();
        $old = explode(',', $oldOpt);
        $new = explode(',', $newOpt);

        if (sizeof($old)) { foreach ($old as $itemOld) { $opt[] = $itemOld;}}
        if (sizeof($new)) { foreach ($new as $itemNew) { $opt[] = $itemNew;}}

        return implode(',', array_unique($opt));
    }

        /**
     * Fonction pour récupérer les options déjà associées à une formule
     * @param int $_idFormule
     */

    public static  function getPrixOptionChoisie($choix) {
        $cnx    = jDb::getConnection();

        $sql = "SELECT SUM(formch_prix) as prix_option  FROM ao_option_formule_choix WHERE formch_id IN (".$choix.")";

        $rs   = $cnx->query($sql);

        $result = array();
        while($row = $rs->fetch()){
			$result[] = $row;
        }

		return $result;
    }

}
